package com.cn.web.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;

import com.cn.web.dao.utils.SqlProviderTemplate;

/**
 * MyBatis 基础接口
 * 
 * @author love
 * @param <T> 处理的Entity对象
 */
public interface BaseDao<T> {
	
	/**
	 * Insert语句从SqlProviderTemplate类中生成
	 * 其他参数如：@SelectKey(before=true, resultType=Long.class, keyProperty="id", statement={" select acct_seq.nextval from dual "})
	 * 
	 * @param entity entity实体对象
	 * @return 影响条数
	 */
	@InsertProvider(type = SqlProviderTemplate.class, method = "insert")
	@Options(keyColumn="id", keyProperty="id", useGeneratedKeys=true)
	public int insert(T entity);
	
	/**
	 * Update语句从SqlProviderTemplate类中生成
	 * 
	 * @param entity entity实体对象
	 * @return 影响条数
	 */
	@UpdateProvider(type = SqlProviderTemplate.class, method = "update")
	public int update(T entity);
	
	/**
	 * 逻辑删除，更新 record_status（记录状态）为0（失效）
	 * Update语句从SqlProviderTemplate类中生成
	 * 
	 * @param entity entity实体对象
	 * @return 影响条数
	 */
	@UpdateProvider(type = SqlProviderTemplate.class, method = "delete")
	public int delete(T entity);
	
	/**
	 * 检索，根据ID检索
	 * @param id 关键字
	 * @param entityClass entity对象类型
	 * @return entity实体Map
	 */
	@SelectProvider(type = SqlProviderTemplate.class, method = "selectByKey")
	public Map<?, ?> selectByKey(@Param("id") Long id,Class<T> entityClass);
	
	
	
	/**
	 * 检索，根据entity对象以及检索条件检索
	 * 
	 * @param entity entity实体对象
	 * @return entity实体Map的List组合
	 */
	@SelectProvider(type = SqlProviderTemplate.class, method = "selectByParams")
	public List<Map> selectByParams(T entity);
}
